//
//  IMToken.h
//  IMSecurity
//
//  Created by infosec2013 on 16/5/30.
//  Copyright © 2016年 Infosec. All rights reserved.
//

#import <Foundation/Foundation.h>
typedef NS_ENUM(NSUInteger,IMOTPAlg){
    
    IMOTPAlgSM3,
    IMOTPAlgSHA1
};

@interface IMToken : NSObject

/**
 初始化，单独初始化token对象时调用，尽量不要使用init进行初始化

 @param user 用户名
 @return token对象
 */
- (instancetype)initWithUser:(NSString *)user error:(int *)error;

/**
 *  申请种子
 *
 *  @param PIN           种子指定保护PIN码
 *  @param completeBlock 完成后回调block
 */
- (void)applySeedWithPIN:(NSString *)PIN
        andCompleteBlock:(void(^)(int resultCode))completeBlock;

/**
 *  更新种子
 *
 *  @param PIN           种子指定保护PIN码
 *  @param newPIN       新种子保护PIN码
 *  @param completeBlock 完成后回调block
 */
- (void)updateSeedWithPIN:(NSString *)PIN
                   newPIN:(NSString *)newPIN
         andCompleteBlock:(void(^)(int resultCode))completeBlock;


- (void)getTokenStateWithCompleteionBlock:(void(^)(int resultCode,NSDictionary* tokenstate))completionBlock;

- (void)loginByQRCodeWithPIN:(NSString *)PIN
                    QRString:(NSString *)QRString
            andCompleteBlock:(void(^)(int resultCode))completeBlock;

/**
 *  获取otp口令
 *
 *  @param algorithm 算法
 *  @param challenge 挑战值，可为空
 *  @param len       口令长度 6，8位
 *  @param cycle     运算时间间隔
 *
 */
- (void)generateOTPWithAlg:(IMOTPAlg)algorithm
                 challenge:(NSString *)challenge
                       len:(int)len
                  andCycle:(int)cycle
           completionBlock:(void(^)(int resultCode,NSString *token))completionBlock;


/// 校验PIN码
/// @param PIN  PIN码
/// @param completeBlock 完成后执行block
- (void)verifyPIN:(NSString *)PIN andCompleteBlock:(void(^)(int ret,int remaintimes))completeBlock;

/**
 *  修改PIN码
 *
 *  @param oldPIN 旧PIN码
 *  @param newPIN 新PIN码
 *  @param completeBlock 完成后执行block  resultCode 错误码，0 成功 其他失败 remainTimes:剩余尝试次数
 */
- (void)changePINWithOldPIN:(NSString *)oldPIN
       andNewPIN:(NSString *)newPIN
           andCompleteBlock:(void(^)(int resultCode,int remaintimes))completeBlock;

/**
 *  判断是否已经有了种子
 *
 *  @return YES NO
 */
- (BOOL)hasTokenSeed;

/**
 *  重置本地种子数据
 *
 *  @return 用于因密码丢失造成的本地加密数据损坏的情况，不可轻易使用。
 */
- (BOOL)resetToken;

/**
 *  获取剩余尝试次数
 *
 *  @return 次数
 */
- (int)getVerifyTimes;


@end
